package mya.mes.mdc.mqtt;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import mya.common.model.json.JsonHelper;
import mya.mes.mdc.constant.Sysconstant;
import mya.mes.mdc.plc.TagUtils;
import mya.mes.mdc.share.plc.TagPrefix;
import mya.mes.mdc.share.vo.plc.PlcTagVo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DataConverter {

    private boolean useMqttDefaultTopic = true;


    public List<PlcTagVo> processMsg(String topic, String payload) throws IOException {
        // System.out.println("payload: " + payload);
        JsonNode jsonNode = JsonHelper.objectMapper.readTree(payload);

        //不删除DT
//        if (ObjectNode.class.isAssignableFrom(jsonNode.getClass())) {
//            ObjectNode objNode = (ObjectNode) jsonNode;
//            objNode.remove("DT");
//        }
        List<PlcTagVo> voList = new ArrayList<>();
        if (useMqttDefaultTopic) {
            String prefix = topic.substring(topic.length() - 2);
            readObj(prefix, jsonNode, voList);
            return voList;
        }

        JsonNode AINode = jsonNode.get(TagPrefix.AI);
        JsonNode DINode = jsonNode.get(TagPrefix.DI);
        JsonNode STNode = jsonNode.get(TagPrefix.ST);

        readObj(TagPrefix.AI, AINode, voList);
        readObj(TagPrefix.DI, DINode, voList);
        readObj(TagPrefix.ST, STNode, voList);
        return voList;
    }


    private void readObj(String prefix, JsonNode jsonNode, List<PlcTagVo> voList) {

        if (jsonNode == null || jsonNode.isNull() || jsonNode.isMissingNode()) {
            return;
        }
        jsonNode.fields().forEachRemaining(entry -> {
            String tagName = entry.getKey();
            JsonNode nodeValue = entry.getValue();
            if (isNull(nodeValue)) {
                return;
            }
            if (nodeValue.isObject()) {
                return;
            }
            PlcTagVo vo = new PlcTagVo();
            //报文里根据SAVE来判断是否保存
            if ("SAVE".equals(tagName)) {
                vo.dataType = "SAVE";
            } else if (Sysconstant.DT.equals(tagName)) {
                //报文里添加lineName字段的处理
                vo.dataType = TagPrefix.ST;
                vo.tagName = tagName;
                vo.tagStrValue = getStrValue(nodeValue);
            } else {
                vo.dataType = prefix;
                vo.tagIndex = Integer.parseInt(tagName);
                vo.tagName = TagUtils.mdcTag(prefix, tagName);
                if (TagPrefix.AI.equals(prefix)) {
                    vo.tagIntValue = getIntValue(nodeValue);
                } else if (TagPrefix.DI.equals(prefix)) {
                    vo.tagBoolValue = getBoolValue(nodeValue);
                } else if (TagPrefix.ST.equals(prefix)) {
                    vo.tagStrValue = getStrValue(nodeValue);
                }
            }
            voList.add(vo);
        });

        //报文里添加topic字段的处理
        PlcTagVo plcTagVo = new PlcTagVo();
        plcTagVo.dataType = TagPrefix.ST;
        plcTagVo.tagName = Sysconstant.TOPIC;
        plcTagVo.tagStrValue = prefix;
        voList.add(plcTagVo);
    }

    private Integer getIntValue(JsonNode nodeValue) {

        Integer value = null;

        if (nodeValue.isNumber() || nodeValue.isBigInteger() || nodeValue.isBigDecimal()) {
            value = nodeValue.asInt();
        } else if (nodeValue.isTextual()) {
            value = Integer.parseInt(nodeValue.asText());
        }


        return value;
    }

    private Double getDoubleValue(JsonNode nodeValue) {
        Double value = null;

        if (nodeValue.isNumber() || nodeValue.isBigInteger() || nodeValue.isBigDecimal()) {
            value = nodeValue.asDouble();
        } else if (nodeValue.isTextual()) {
            value = Double.parseDouble(nodeValue.asText());
        }


        return value;
    }

    private Boolean getBoolValue(JsonNode nodeValue) {

        Integer value = null;


        if (nodeValue.isBoolean()) {
            return nodeValue.booleanValue();
        }

        String tmp = nodeValue.asText();

        if ("1".equals(tmp) || "true".equals(tmp)) {
            return true;
        }


        return false;
    }

    private String getStrValue(JsonNode nodeValue) {
        if (nodeValue.isTextual()) {
            return nodeValue.textValue();
        }

        return nodeValue.asText();
    }


    private boolean isNull(JsonNode nodeValue) {
        if (nodeValue == null) {
            return true;
        }

        if (nodeValue.isMissingNode() || nodeValue.isNull()) {
            return true;
        }

        return false;
    }


    void setUseMqttDefaultTopic(boolean useMqttDefaultTopic) {
        this.useMqttDefaultTopic = useMqttDefaultTopic;
    }

}
